package cn.dengta.context.auth;

import java.lang.annotation.*;

/**
 * 用于进行权限控制的注解，将该注解应用在对应的类型或方法上，即可在调用指定的类型或方法时，自动进行对应的权限判断<br>
 * 该注解只对作为Struts2的Action的类或方法生效
 *
 * @author Ready
 * @date 2014-10-19
 */
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Permission {

	/** 权限码：普通用户(任意用户登录即可访问) */
	String USER = "user";
	/** 权限码：管理员(任意管理员登录即可访问) */
	String ADMIN = "admin";
	/** 权限码：系统顶级权限(仅限开发人员使用，一般是ID=1的用户) */
	String SYSTEM = "system";

	/**
	 * 权限码
	 */
	String value() default "";

	/**
	 * 本方法处理前台请求时要求前台用户应具备的权限码。<br>
	 * 如果该属性被设置，则表示该方法支持前台和后台的业务功能共用。
	 * 后台请求的用户需要具备 {@code value} 对应的权限码才能访问；前台请求的用户需要具备 {@code frontCode} 对应的权限码，也可访问该方法。
	 * 则普通用户通过前台也可以访问该方法；后台用户通过后台访问该方法则需要具备对应的权限码 <br>
	 * 后台用户通过前台请求时，务必附带请求头"App-Id: *front*"，否则视为后台访问 <br>
	 * 【注意】：方法中请务必对请求参数和用户类型进行严格的权限判断
	 */
	String frontCode() default "";

	/**
	 * 需要进行多权限管理的方法菜单数组<br>
	 * 该注解属性只能在方法上定义，否则无效
	 */
	Menu[] menus() default {};

	/**
	 * 是否强行修改分包查询条件，默认为false
	 * <p>
	 * 该属性在admin中才生效
	 *
	 * @see cn.dengta.webapp.admin.permission.WesKitPermissionAspect 参数解析
	 * 动态修改query对象中wesKit字段的值，<br>
	 * 如果该属性为true且当前登录用户的wesKit有值，则会强制修改wesKit字段的值为当前用的wesKit，否则不会修改
	 */

	boolean isWesKit() default false;

}
